class ClusteringReports:
def __init__(self):
pass
# Hopkinsova statistika,
# test postojanja grupisanja podataka / klastera
def hopkins(self, X, m=30):
# TODO: Provera ulaza
self.X = X
tree = KDTree(X)
X_copy = X.copy()
np.random.shuffle(X_copy)
X_sample = X_copy[:30]
lower = np.min(X, axis=0)
higher = np.max(X, axis=0)
Y = np.random.uniform(lower.ravel(), higher.ravel(), (m, X.shape[1]))
U = tree.query(Y, 2, return_distance=True)[0][:, 1].sum()
W = tree.query(X_sample, 2, return_distance=True)[0][:, 1].sum()
return U / (U + W)
# Silueta,
# Test kvaliteta klasterovanja na osnovu poredjenja medjusobnih udaljenosti
# tacaka unutar jednog klastera u odnosu na tacke najblizih susednih klastera
def silhouette(self, X, label):
return silhouette_score(X, labels)
# Skor homogenosti,
# Test kvaliteta klasterovanja na osnovu cistoce klastera u odnosu na zastupljenost
# tacaka razlicitih klasa. (Entropija)
def homogeneity(self, class_labels, cluster_labels):
return homogeneity_score(class_labels, cluster_labels)
# Generisanje izvestaja klasterovanja
def generate_report(self, X, cluster_labels, class_labels=None):
report = ''
report += '============== REPORT ===============\n'
report += f'Num samples: {X.shape[0]}\n'
if class_labels is not None:
report += f'Num classes: {len(set(class_labels.ravel()))}\n'
report += f'Num attributes: {X.shape[1]}\n'
report += f'Num clusters: {len(set(cluster_labels.ravel()))}\n'
report += '\n'
report += f'Silhouette coef.: {self.silhouette(X, labels)}\n'
report += f'Homogeneity score: {self.homogeneity(class_labels, cluster_labels)}\n'
report += f'Elapsed time: {"N/A"}\n'
report += f'Num iterations: {"N/A"}\n'
report += '====================================\n'
f = open('output.txt', 'w')
f.write(report)
f.close()
report_data = np.concatenate([X, cluster_labels.reshape(cluster_labels.shape[0], 1)], axis=1)
# if not dataframe:
columns = [f'Attribute_{i}' for i in range(1, X.shape[1] + 1)] + ['Cluster']
df = pd.DataFrame(report_data, columns=columns)
df = df.astype({ 'Cluster': 'int'})
df.to_csv('output.csv', index=False)
return True